package com.elephant.core.basedatatype;

import java.util.*;

/**
 * @author zhanghaidong
 * @version V1.0
 * @description
 * @date 2019/4/10 15:38
 */
public class IntegerTest {

    public static void main(String[] args) {

        // 10 = 0000 1010
        //  00001010
        //& 00000101
        //= 00001111
        // ....
        // 00001111 - 00000111 = 00001000 = 8
        System.out.println(Integer.highestOneBit(10));

        // public static int lowestOneBit(int i) {
        //
        //        return i & -i; 负数要转成补码运算
        //    }
        // 10 = 00001010  -10 原码 1 00001010  反码 1 11110101 补码 1 11110110
        // 00001010
        //&11110110
        //=00000010 = 2
        System.out.println(Integer.lowestOneBit(10));

        //10 = 0000 1010
        //该方法的作用是返回无符号整型i的最高非零位前面的0的个数，包括符号位在内；   28
        System.out.println(Integer.numberOfLeadingZeros(10));
        //该方法的作用是返回无符号整型i的最低非零位后面的0的个数      1
        System.out.println(Integer.numberOfTrailingZeros(10));


        //用于统计二进制中1的个数 10 = 0000 1010
        System.out.println(Integer.bitCount(10));

        // 10 = 0000 1010 循环左移2 10乘以2的2次方
        System.out.println(Integer.rotateLeft(10,2));
        // 10除以2的2次方 右移2位
        System.out.println(Integer.rotateLeft(40,-2));

        //10
        System.out.println(Integer.rotateRight(40,2));
        //40
        System.out.println(Integer.rotateRight(10,-2));

        //反转二进制补码中位的顺序。即将第32位的值与第1位的值互换，第31位的值与第2位的值互换，等等，依次
        //10 = 00000000 00000000 00000000 00001010 -----> 01010000 00000000 00000000 00000000 = 2的30次方 加上 2的28次方
        System.out.println(Integer.reverse(10));

        System.out.println("-------------------------------------------------------");
        //按字节交换 4个字节
        //将第一个字节与第四个字节的位置互换，第二个字节与第三个字节位置互换
        //167772160
        System.out.println(Integer.reverseBytes(10));
        //167772160
        System.out.println(10 << 24);
        //738263040
        //300 = 256 + 44   256在高位里就是1
        System.out.println(Integer.reverseBytes(300));
        System.out.println((44 << 24) + (1 << 16));


        System.out.println("----------------------");
        //获取整数符号，为负返回-1，正返回1，零返回0
        System.out.println(Integer.signum(10));
        System.out.println(Integer.signum(-10));


        System.out.println("-----------------------");
        /**
         * decode合适用来分析数字
         * 可以分析
         * 8进:010=>分析后为 8
         * 10进:10=>分析后为 10
         * 16进:#10|0X10|0x10=>分析后是 16
         * 而valueOf    只能数字的String
         * 像 010 这样的8进制 他会解析成 =>10
         *
         *
         * 八进制表示方法是，在八进制的数值前面必须加前缀“0”，其数码取值为0-7例如023，045等
         * 十进制就是我们常用的，什么都不用加
         * 十六进制前面必须加“0X"或"0x“取值为0-9，A-F，如02XA等。
         */
        //10
        System.out.println(Integer.parseInt("010"));
        //10
        System.out.println(Integer.valueOf("010"));
        //8 八进制
        System.out.println(Integer.decode("010"));
        //16 十六进制
        System.out.println(Integer.decode("0x10"));
        //???????? 16
        System.out.println(Integer.decode("#10"));
        System.out.println("-------------------------");


        System.out.println(Integer.parseInt("10"));
        /**
         * parseInt(String s,int radix)就是求“int radix”进制数“String s”的十进制数是多少
         */
        //2
        System.out.println(Integer.parseInt("10",2));
        //10
        System.out.println(Integer.parseInt("10",10));
        //16
        System.out.println(Integer.parseInt("10",16));

        System.out.println("======================");
        Properties properties = System.getProperties();
        //都是value
        properties.values().stream().forEach(t -> System.out.println(t));
        System.out.println("======================");
        Set<Map.Entry<Object, Object>> entrySet = properties.entrySet();
        Iterator<Map.Entry<Object, Object>> iterator = entrySet.iterator();
        while (iterator.hasNext()){
            Map.Entry<Object, Object> next = iterator.next();
            System.out.println("key:"+ next.getKey());
            System.out.println("value:" + next.getValue());
        }
        System.out.println("======================");
        //64 获取系统的值
        System.out.println(Integer.getInteger("sun.arch.data.model"));
        //不存在返回 指定值 100
        System.out.println(Integer.getInteger("NUMBER_OF_PROCESSORS", 100));


        System.out.println("------------------------------");
        //0x14
        System.out.println(Integer.toHexString(20));
        //10100
        System.out.println(Integer.toBinaryString(20));
        //024 八进制
        System.out.println(Integer.toOctalString(20));

        System.out.println(2 << 2);


        /**
         * 192.168.80.70
         *
         * 二进制 11000000 10100100 01010000 01000110
         *
         * 11000000=128*1+64*1=192；
         * 10101000=128*1+32*1+8*1=168；
         * 01010000=64*1+16*1=80；
         * 01000110=64*1+4*1+2*1=70；
         */
        System.out.println(Integer.toBinaryString(192));
        System.out.println(Integer.toBinaryString(168));
        System.out.println(Integer.toBinaryString(80));
        System.out.println(Integer.toBinaryString(70));

    }
}
